#include <stdio.h>
#include "functional.h"

int print_as_int(int x)
{
  printf(" %i", x);
  return x;
}

int print_as_char(int x)
{
  printf(" %c", x);
  return x;
}

int print_tail(int, int)
{
  printf(" That's all folks\n");
  return 0;
}

template<class T>
void doit(T const& op)
{
  for(int i = 32; i < 256; ++i)
    op(i);
}

typedef pointer_to_unary_function<int, int> int_unary_fn;
typedef pointer_to_binary_function<int, int, int> int_binary_fn;

TEMPLATE_ptr_fun_unary(int, int)
TEMPLATE_ptr_fun_binary(int, int, int)
TEMPLATE_compose2(int_binary_fn, int_unary_fn, int_unary_fn, int, int)

int main()
{
  doit(compose2(ptr_fun(print_tail), ptr_fun(print_as_int), ptr_fun(print_as_char)));
}
